iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0
自我挑戰組

Rails 手工打造自己的部落格 系列 第 19

Rails 手工打造自己的部落格 - Soft Delete 軟刪除

  • 分享至 

  • xImage
  •  

今天來介紹一個刪除的小技巧

軟刪除

什麼是軟刪除呢?
英文叫做 「Soft Delte」,如果用意思來翻,就是柔軟的刪除,比較溫和的方式(?
但說白了就是假刪除,為什麼說是假刪除呢?
有沒有發現在一些平台裡面刪掉的資料還可以找回來,
就是因為他們都用了這個軟刪除的作法,

這是確保用戶如果想找回自己刪除的資料,
或是用戶有違反規定或有違法的舉動,但他卻把證據都銷毀,
那我們就還是可以從後台就把那些資料全部抓出來,

再舉個例子,就好像我們刪除信件或是相簿的時候,
通常東西不會直接不見,而是先進去了一個叫做垃圾桶的地方,等時間到了或是最終確認的時候才會進行移除,
所以這個功能是非常常見的,
這個做法其實很簡單,因為說白了就是讓他 看不見 而已,

  • 那應該怎麼做呢?
    我們要在 Article 這個模型中多開一個欄位,叫做 delete_at
    用到結尾是at通常就跟時間有關係,這是一個紀錄刪除時間的欄位
    增加欄位的話有兩個做法,

1. 新增遷移檔(migration)

在協作上,通常已經有推上遠端的東西都要再新增遷移檔,來改動其欄位
不然隊友的版本跟你的不一樣就會壞掉,而且才能夠知道是什麼時間點增加的,
進而推斷是因為什麼需求而需要使用,
那我們就可以來下指令

$ rails g migration add_delete_at_to_articles

長出 migrattion 之後要在裡面寫

class DeletedAt < ActiveRecord::Migration[6.1]
  def change
    # 新增欄位: 資料表名稱,欄位名稱,型態
    add_column :notes, :deleted_at, :datetime 
    # 新增索引: 加快查詢,概念有點像寫書會加的附錄
    add_index :notes, :deleted_at
  end
end

然後再跑一次

$ rails db:migrate 

就完成了!

2. Roll Back 倒轉

第二種方式就是可以直接從我們上一個剛創好的 migration 直接進行修改

$ rails db:rollback

這指令可以讓上一個 migration 倒回還沒做 db:migrate 的時候
如果想往後倒回去多一點的話 可以在後面接 STEP= 的參數
譬如往後倒三個

$ rails db:rollback STEP=3

然後我們直接在 migration 上面做修改

class CreateArticles < ActiveRecord::Migration[7.0]
  def change
    create_table :articles do |t|
      t.string :title
      t.text :content
      t.datetime :deleted_at  

      t.timestamps
    end

    add_index :articles, :deleted_at
  end
end

然後在 controller 裡面也要修改
把刪除方法裡面的內容改成更新,來做到假刪除的標記

  def destroy
    @article.update(delete_at: Time.now)
    redirect_to articles_path, notice: '刪除成功'
  end

而最終呈現出來的地方也要調整,就是在列表上不能看到
意思就是只抓 delete_at 裡面是 nil

  def index
    @articles = Article.where(delete_at: nil).order(id: :desc)
  end

這樣我們在刪除後這則貼文就會消失了, YA~
但這樣使用網址還是可以找的到這篇文章
所以我們可以直接再 set_article 的地方,再擋一次

  def set_article
    @article = Article.find_by!(id: params[:id], delete_at: nil)
  end

這樣如果刪掉的話,在檯面上就真消失了
但東西卻還是存在在資料庫裡的!


上一篇
Rails 手工打造自己的部落格 18 - CRUD -D
下一篇
Rails 手工打造自己的部落格 20-會員系統
系列文
Rails 手工打造自己的部落格 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言